package com.dp.server;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.dp.client.dto.AlmacenDTO;
import com.dp.client.dto.PaqueteDTO;
import com.dp.client.dto.Reportes;
import com.dp.client.servicios.reporte.IServiciosReporte;

import com.dp.server.entities.Almacen;

import com.dp.server.backend.servicios.AplicarCambiosFecha;

import com.google.gwt.user.server.rpc.RemoteServiceServlet;

@SuppressWarnings("serial")
public class IServiciosReporteImpl extends RemoteServiceServlet implements IServiciosReporte
{
	@Override

	public Boolean aplicar_cambio( Date fecha , String id) {
		int idInt = Integer.parseInt( id );
		AplicarCambiosFecha instance = new AplicarCambiosFecha();
		switch( idInt ){
			case 1 : instance.recoger_paquetes_destino( fecha ); break;
			case 2 : instance.aterrizar_vuelos(fecha); break;
			case 3 : instance.entrar_a_almacen(fecha); break;
			case 4 : instance.levantar_paquetes(fecha); break;
			case 5 : instance.volar_vuelos(fecha); break;
			case 6 : instance.ciclo_completo(fecha); break;
		}
		return true;
	}
	
	public Boolean aplicar_cambio_en_rango( Date inicio , Date fin ){
		AplicarCambiosFecha instance = new AplicarCambiosFecha();
		instance.cambio_en_rango(inicio, fin);
		return true;
	}
	@Override
	public Reportes ReportePaquete(int idCiudad,int idPais, int idContinente)
	{
		IServiciosPaqueteImpl paquete = new IServiciosPaqueteImpl();
		List<PaqueteDTO> lista = paquete.listPaquetes();
		int espera = 0;
		int tiempo = 0;
		int retrasado = 0;
		List<String> listaS = new ArrayList<String>();
		listaS.add("En proceso");
		listaS.add("A tiempo");
		listaS.add("Retrasados");
		Reportes reporte = new Reportes();
		
		for(int i=0;i<lista.size();i++)
		{
			AlmacenDTO a= new IServiciosAlmacenImpl().getAlmacen(lista.get(0).almacenOrigen);
			
			if(idCiudad>0 && a.getCiudad().getId()!=idCiudad){
				continue;
			}
			else if(idPais>0 && a.getCiudad().getPais().getId()!=idPais){
				continue;
			}
			else if(idContinente>0 && a.getCiudad().getPais().getContinente().getId()!=idContinente){
				continue;
			}
			
			if(lista.get(i).getFechaRealLlegada()==null)
				espera++;
			else
			{
				Date programada = lista.get(i).getFechaEstimadaLlegada();
				Date real = lista.get(i).getFechaRealLlegada();
				int anoP = programada.getYear();
				int mesP = programada.getMonth();
				int diaP = programada.getDay();
				int horaP = programada.getHours();
				int anoR = real.getYear();
				int mesR = real.getMonth();
				int diaR = real.getDay();
				int horaR = real.getHours();
				if(anoP<anoR)
					retrasado++;
				else
					if((anoP==anoR)&&(mesP<mesR))
						retrasado++;
					else
						if((anoP==anoR)&&(mesP==mesR)&&(diaP<diaR))
							retrasado++;
						else
							if((anoP==anoR)&&(mesP==mesR)&&(diaP==diaR)&&(horaP<horaR))
								retrasado++;
							else
								tiempo++;
			}
		}
		reporte.pointsX = listaS;
		List<Integer> listaD = new ArrayList<Integer>();
		double total = retrasado + tiempo +espera;
		if(total==0)
		{
			listaD.add(0);
			listaD.add(0);
			listaD.add(0);
		}
		else
		{
			//listaD.add(espera/total);
			listaD.add(espera);
			//listaD.add(tiempo/total);
			listaD.add(tiempo);
			//listaD.add(retrasado/total);
			listaD.add(retrasado);
		}
		reporte.pointsYHigh = listaD;
		//IServiciosEnviarCorreo correo = new IServiciosEnviarCorreo();
		//correo.CambioRuta(1, 2, new PaqueteDTO());
		return reporte;
	}

	@Override
	public Reportes ReporteVuelo() {
		Reportes reporte = new Reportes();
		IServiciosVueloImpl vuelo = new IServiciosVueloImpl();
		return reporte;
	}
}
